//
//  MainViewController.swift
//  xinlangweibo
//
//  Created by yangshuo on 15/11/23.
//  Copyright © 2015年 yangshuo. All rights reserved.
//
//待解决的知识点:1.extension
//             2.函数重载
//             3.override .重写父类属性
//              4. .与()函数语法之间的区别,对象方法与类方法?
//              5.    func visitorViewDidRegister() 为什么一般情况下括号中需要加self,老师只说明了不加的理由,这个代理方法只是给VisitorTableViewController来调用,没有复用
//               6.在应用程序开发中，为什么一定要封装隔离网络框架?将第三方框架进行封装隔离,避免泛滥?APP<->网络工具<-(block回调)>AFN
            //   7.弹出控制器modal是哪个方法实现的?
 //               8.方法名前面的M,V F...等等有什么意义?
//              9.控制器弹出的moda方法是如何实现
//如果不加CGFloat的w就表示的点,加上CGFloat表示的是像素? let w: CGFloat = 1



//注意:在oc于swift中数据类型首字母大写!
// JSON如果是 NSNumber，则没有引号！在做 KVC 指定属性类型非常重要！
//        // 提示：如果使用 if let / guard let 统统使用as `?`
//extension只允许便利构造函数,不允许指定构造函数
//extension不能定义存储型属性,定义存储性  属性,会破坏类本身的结构!
//单纯使用as大多数在三种情况下用来'桥接'
//1.String as NSString
//2.NSArray as [array]
//3.NSDictionary as [String: AnyObject]
// var description:String{} 计算型属性(类似于有返回值的函数,可以让调用的时候,语义更清晰)
//所有'使用约束'设置的控件,不要在设置frame
//通知中心是同步的,一旦发送通知会先执行监听方法,监听方法结束后,才执行后续代码
//销毁控制器dismissViewControllerAnimated,有延迟不是立即将控制器销毁,在swift中可以使用尾随闭包self.dismissViewControllerAnimated(false){}

//使用UIImage imageNamed创建的图像,缓存由系统管理,程序员不能直接释放
//UIImage imageNamed适用于小的图片素材,方便循环使用(系统内部优化,使图片不会创建很多次,避免创建图片而产生很大的延迟,同时也不会对内存造成大的消耗)
//高清大图千万不要用这种方法,OC中使用contentOfFile方法加载
//dismiss控制器谁申请谁释放
//view是IOS最轻量级的控件,所有控件都继承自uiView,Uiview本身什么都没有
//CMD+CTRL+E 全局修改
//懒加载属性是全局的,全局的属性来记录它(自身的属性),代码其它位置修改它时通过属性方便找到
//如果数组可选,不允许遍历.原因:数组通过下表进行检索
//计算九宫格第一时间想到collectionview,collectionview是uitableview的进阶版
//在使用自动布局时,绝大多数出现问题,是因为约束加多了!
//计算九宫格行数的公式:(count - 1) / rowCount + 1 这个公式很重要
//collectionview与tableview添加控件时,最好在contentview中添加,尤其是tableView

//响应者链条问题->控件什么时候无法交互?
//1.alpha透明度小于0.01
//2.hidden等于true
//3.userInteractionEnabled等于false
//4.控件在父类的范围外
//5.控件被其它控件遮盖


import UIKit

class MainViewController: UITabBarController {
    //点击撰写按钮
    //如果'单纯'的使用private,运行循环将无法正确发送消息,导致崩溃
    //如果使用'@objc'修饰符号可以保证运行循环能够正确发送此消息,即使函数被标记为private
    //一句话:注意监听方法需要使用@objc关键字修饰
   @objc private func clickComposedButton(){
        print("点我啊")
    }

    //viewdidload,加载控件
    override func viewDidLoad() {
        super.viewDidLoad()
//添加第一个视图控制器
        //添加控制器并不会创建tabbar中的按钮
        //懒加载是无处不在的,所有控件都是延迟创建的!
        addChildViewController()
        setupComposedButton()
        
    }
    //view显示
    override func viewWillAppear(animated: Bool) {
        //因为button创建早于这步,
        //super.viewWillAppear会创建5个tarbar,而tarbar会覆盖button
        //
        super.viewWillAppear(animated)
        tabBar .bringSubviewToFront(composedButton)
    }
    // MARK: - 懒加载控件
    //懒加载使用的闭包语法,(为了方便重复使用,从懒加载创建改为便利构造!)
    private lazy var composedButton: UIButton = UIButton(
    imageName: "tabbar_compose_icon_add",
        backImageName: "tabbar_compose_button"
    )
    
        //懒加载按钮        

}

// MARK: - 设置界面
extension MainViewController{
    //添加并设置撰写按钮
    private func setupComposedButton(){
        tabBar.addSubview(composedButton)
        let count = childViewControllers.count
        let w = tabBar.bounds.width / CGFloat(count)
        composedButton.frame = CGRectInset(tabBar.bounds, w * 2, 0)
        composedButton.addTarget(self, action: "clickComposedButton",forControlEvents: .TouchUpInside)
        

    }
    ///重载
    private func addChildViewController() {
        // 图片渲染颜色
      //  tabBar.tintColor = UIColor.orangeColor()
        addChildViewController(HomeViewController(), title: "首页", imageNamed: "tabbar_home")
        addChildViewController(MessageViewController(), title: "消息", imageNamed: "tabbar_message_center")
        addChildViewController(UIViewController())
        addChildViewController(DiscoverViewController(), title: "发现", imageNamed: "tabbar_discover")
        addChildViewController(ProfileViewController(), title: "我", imageNamed: "tabbar_profile")
    }
    //重构代码抽取参数
    private func addChildViewController(vc: UITableViewController, title: String, imageNamed: String ) {
        vc.title = title
        vc.tabBarItem.image = UIImage(named: imageNamed)
        //导航控制器
        let nav = UINavigationController(rootViewController: vc)
        addChildViewController(nav)
        
    }
}




